package Servicios;

import DAO.DAOCuentas;
import DAO.DAOInformacionPersonal;
import Dominio.Administrador;
import Dominio.CuentaSesion;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GestorDeCuentasDeAdministrador extends HttpServlet {

    public GestorDeCuentasDeAdministrador() {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
        String id = request.getParameter("id");

        if (id.equals(ID_REGISTRO_ADMINISTRADOR)) {
            registrarAdministrador(request, response);
        } else if (id.equals(ID_BUSQUEDA_ADMINISTRADOR)) {
            buscarAdministrador(request, response);
        } else if (id.equals(ID_MODIFICACION_CONTRASENIA_ADMINISTRADOR)) {
            modificarContraseniaDeAdministrador(request, response);
        } else if (id.equals(ID_MODIFICACION_CUENTA)) {
            modificarCuentaAdmin(request, response);
        }
    }

    private void registrarAdministrador(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;

        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            try {
                String nombre = request.getParameter("nombre");
                String apellidoPaterno = request.getParameter("apellidoPaterno");
                String apellidoMaterno = request.getParameter("apellidoMaterno");
                String nombreUsuario = request.getParameter("nombreDeUsuario");
                String contrasenia = request.getParameter("contrasenia");

                if (nombre != null && apellidoPaterno != null && apellidoMaterno != null && nombreUsuario != null && contrasenia != null) {

                    Administrador administrador = new Administrador();
                    administrador.setNombres(nombre);
                    administrador.setApellidoPaterno(apellidoPaterno);
                    administrador.setApellidoMaterno(apellidoMaterno);
                    CuentaSesion cuentaSesionAdministrador = administrador.getCuentaSesion();
                    cuentaSesionAdministrador.setNombreUsuario(nombreUsuario);
                    cuentaSesionAdministrador.setContrasenia(contrasenia);

                    DAOCuentas daoCuenta = new DAOCuentas();

                    if (daoCuenta.existeCuenta(nombreUsuario)) {
                        out.println("El nombre de usuario no está disponible, ingrese un nombre de usuario diferente");
                    } else {
                        DAOInformacionPersonal daoInformacionPersonal = new DAOInformacionPersonal();
                        int idInformacionPersonal = daoInformacionPersonal.registrarPersona(administrador);
                        daoInformacionPersonal.cerrarConexionAPersonas();

                        daoCuenta.registrarCuenta(cuentaSesionAdministrador, PRIVILEGIO_ADMINISTRADOR, idInformacionPersonal);
                        daoCuenta.cerrarConexionACuentas();

                        out.println("Administrador registrado con éxito");
                    }
                } else {
                    out.println("Ocurrió un error al procesar la petición");
                }
            } finally {
                out.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }

    private void buscarAdministrador(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;

        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            try {
                String nombreDeUsuario = request.getParameter("nombreDeUsuario");

                if (nombreDeUsuario != null) {

                    DAOCuentas daoCuentas = new DAOCuentas();
                    ResultSet registros = daoCuentas.buscarInformacionPersonalDeCuenta(nombreDeUsuario, PRIVILEGIO_ADMINISTRADOR);

                    String nombres = "";
                    String apellidoPaterno = "";
                    String apellidoMaterno = "";
                    int contadorDeRegistros = 0;

                    while (registros.next()) {
                        nombres = registros.getObject(1).toString();
                        apellidoPaterno = registros.getObject(2).toString();
                        apellidoMaterno = registros.getObject(3).toString();
                        contadorDeRegistros++;
                    }

                    if (contadorDeRegistros < 1) {
                        out.println("<h2>No se encontr&oacute; el administrador</h2>");
                    } else if (contadorDeRegistros > 1) {
                        out.println("<h2>Ocurri&oacute; un error al procesar la informaci&oacute;n</h2>");
                    } else if (contadorDeRegistros == 1) {
                        out.println("<h2>Datos del administrador:</h2>"
                                + "<table>"
                                + "   <tr>"
                                + "       <td>Nombre de usuario: " + nombreDeUsuario + "</td>"
                                + "   </tr>"
                                + "   <tr>"
                                + "       <td>Nombre(s): " + nombres + "</td>"
                                + "   </tr>"
                                + "   <tr>"
                                + "       <td>Apellido paterno: " + apellidoPaterno + "</td>"
                                + "   </tr>"
                                + "   <tr>"
                                + "       <td>Apellido materno: " + apellidoMaterno + "</td>"
                                + "   </tr>"
                                + "</table>"
                                + "<h2>Modifique la contrase&ntilde;a:</h2>"
                                + "<table>"
                                + "   <tr>"
                                + "       <td><input type = \"hidden\" id =\"hiddenNombreDeUsuario\" value=\"" + nombreDeUsuario + "\"/></td>"
                                + "   </tr>"
                                + "   <tr>"
                                + "       <td>Nueva contrase&ntilde;a:</td>"
                                + "       <td><input type = \"password\" id =\"contraseniaNueva\"/></td>"
                                + "   </tr>"
                                + "   <tr>"
                                + "       <td>Repita la nueva contrase&ntilde;a:</td>"
                                + "       <td><input type = \"password\" id =\"confirmacionContraseniaNueva\"/></td>"
                                + "   </tr>"
                                + "</table>"
                                + "<input type=\"button\" id=\"modificarContrasenia\" value=\"Guardar nueva contrase&ntilde;a\"/>");
                    }

                    daoCuentas.cerrarConexionACuentas();
                } else {
                    out.println("Ocurrio un error al procesar la peticion");
                }

            } catch (SQLException ex) {
                System.out.println("Ocurrió un error al tratar de buscar el administrador");
            } finally {
                out.close();
            }


        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }

    private void modificarContraseniaDeAdministrador(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;

        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            try {

                String nombreDeUsuario = request.getParameter("nombreDeUsuario");
                String contraseniaNueva = request.getParameter("contraseniaNueva");

                if (nombreDeUsuario != null && contraseniaNueva != null) {

                    DAOCuentas daoCuenta = new DAOCuentas();
                    daoCuenta.actualizarContraseniaDeCuenta(nombreDeUsuario, contraseniaNueva);
                    daoCuenta.cerrarConexionACuentas();

                    out.println("<h1>La nueva contrase&ntilde;a ha sido guardada</h1>");
                } else {
                    out.println("Ocurrio un error al procesar la peticion");
                }
            } finally {
                out.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    private final String ID_REGISTRO_ADMINISTRADOR = "registrarAdministrador";
    private final String ID_BUSQUEDA_ADMINISTRADOR = "buscarAdministrador";
    private final String ID_MODIFICACION_CONTRASENIA_ADMINISTRADOR = "modificarContraseniaAdministrador";
    private final int PRIVILEGIO_ADMINISTRADOR = 1;
    private final String ID_MODIFICACION_CUENTA = "modificarCuenta";

    private void modificarCuentaAdmin(HttpServletRequest request, HttpServletResponse response) {
        try {
            String respuesta = "";
            PrintWriter out = null;
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            String nombreModif = request.getParameter("nombreModif");
            String passModif = request.getParameter("passModif");
            String nombreActual = request.getParameter("nombreActual");
            DAOCuentas daoCuenta = new DAOCuentas();
            daoCuenta.actualizarCuentaAdministrador(nombreActual, nombreModif, passModif);
            respuesta = "Se actualizo correctamente la cuenta";
            out.println(respuesta);

        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
